package com.um.jdy.ykc.command;

import com.um.jdy.ykc.utils.RadixsUtil;
import lombok.Data;

/**
 * 云快充1.3协议，上传实时监测数据指令为 0x11,1.4版本更换为 0x13,字段结束不变
 * 上传实时监测数据（充电桩->运营平台）
 *
 * @author 甘天伟
 * @since 2022/6/27
 * 版权所有 广州优匠科技有限公司
 */
@Data
public class Cmd11UploadRealtimeData extends YkcCommand {

    /**
     * 交易流水号：16个字节
     */
    private String transactionNo;

    /**
     * 桩编码：7个字节
     */
    private String code;

    /**
     * 枪号：1个字节
     */
    private int gunNo;

    /**
     * 状态：1个字节
     * 0x00：离线 0x01：故障 0x02：空闲 0x03：充电
     */
    private int status;

    /**
     * 枪是否归位：1个字节
     * 0x00 否 0x01 是 0x02 未知
     */
    private int gunReturned;

    /**
     * 是否插枪：1个字节
     * 0x00 否 0x01 是
     */
    private int gunInserted;

    /**
     * 输出电压：2个字节
     */
    private int voltage;

    /**
     * 输出电流：2个字节
     */
    private int electricity;

    /**
     * 枪线温度：1个字节
     */
    private int gunLineTemperature;

    /**
     * 枪线编码：8个字节
     */
    private String gunLineNo;

    /**
     * SOC：1个字节
     */
    private int soc;

    /**
     * 电池组最高温度：1个字节
     */
    private int batteryMaxTemperature;

    /**
     * 累计充电时间：2个字节
     */
    private int totalChargeMinutes;

    /**
     * 剩余时间：2个字节
     */
    private int remainMinutes;

    /**
     * 充电度数：4个字节
     */
    private int chargeCapacity;

    /**
     * 计损充电度数：4个字节
     */
    private int lossPower;

    /**
     * 已充金额：4个字节
     */
    private int chargeAmount;

    /**
     * 硬件故障：2个字节
     */
    private int hardwareError;

    @Override
    public void parseBytes(byte[] bytes) {
        super.parseBytes(bytes);
        transactionNo = RadixsUtil.bytesToHexString(readBytes(data, 0, 16));
        code = RadixsUtil.bytesToHexString(readBytes(data, 16, 7));
        gunNo = RadixsUtil.byteToInteger(data[23]);
        status = RadixsUtil.byteToInteger(data[24]);
        gunReturned = RadixsUtil.byteToInteger(data[25]);
        gunInserted = RadixsUtil.byteToInteger(data[26]);
        voltage = RadixsUtil.bytesToInteger(readBytes(data, 27, 2),true);
        electricity = RadixsUtil.bytesToInteger(readBytes(data, 29, 2),true);
        gunLineTemperature = RadixsUtil.byteToInteger(data[31]);
        gunLineNo = RadixsUtil.bytesToHexString(readBytes(data, 32, 8));
        soc = RadixsUtil.byteToInteger(data[40]);
        batteryMaxTemperature = RadixsUtil.byteToInteger(data[41]);
        totalChargeMinutes = RadixsUtil.bytesToInteger(readBytes(data, 42, 2),true);
        remainMinutes = RadixsUtil.bytesToInteger(readBytes(data, 44, 2),true);
        chargeCapacity = RadixsUtil.bytesToInteger(readBytes(data, 46, 4), true) * 100;
        lossPower = RadixsUtil.bytesToInteger(readBytes(data, 50, 4), true) * 100;
        chargeAmount = RadixsUtil.bytesToInteger(readBytes(data, 54, 4), true) / 100;
        hardwareError = RadixsUtil.bytesToInteger(readBytes(data, 58, 2));

        transactionNo = RadixsUtil.getTransactionNo(transactionNo);
        code = RadixsUtil.getCode(code);
    }
}
